/**
 * 
 */
package logica.colecciones;
import java.io.Serializable;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.TreeMap;

import logica.clases.Pais;
import logica.clases.Partida;
import logica.datatypes.Jugador.DataJugador_R1;
import logica.datatypes.Jugador.DataJugador_R11;
import logica.datatypes.Jugador.DataJugador_R5;
import logica.datatypes.Partida.DataPartida_R16;
import logica.datatypes.Partida.DataPartida_R4;
import java.util.Iterator;
/**
 * @author pity
 *
 */
public class Partidas implements Serializable{
	private TreeMap<String,Partida> partidas;
	private static Partidas instancia;
	private final static long serialVersionUID = 1;
	
	private Partidas(){
		partidas = new TreeMap<String,Partida>(); //esto segun teorico
	}
	
	public static Partidas getInstancia(){
		if (instancia == null)
			instancia = new Partidas();
		return instancia;
	}
	
	public void setPartidas(TreeMap<String,Partida> part){
				partidas = part;
	}

	public TreeMap<String,Partida> getPartidas(){
		return partidas;
	}	
	
	public void insert(Partida partida){
		partidas.put(partida.getCodigo(), partida);
	} 
	
	public Boolean member(String codPartida){
		return partidas.containsKey(codPartida);	
	}
	
	public Partida find(String codPartida){
		return partidas.get(codPartida);
	}
	
	public boolean hayJugadorEnTurnoEnPEnCurso() throws RemoteException{
		Partida partEnCurso = partidaEnCurso();
		return partEnCurso.hayJugadorEnTurnoEnPEnCurso();
	}
	
	public boolean hayJugadorLogueado() throws RemoteException{
		Partida partEnCurso = partidaEnCurso();
		return partEnCurso.hayJugadorLogueado();
	}
	
	public Boolean hayPartidaEnCurso(){
		Iterator <Partida> iter = partidas.values().iterator();	
		boolean hayEnCurso = false;
		while (iter.hasNext() && !hayEnCurso)
		{
			Partida partida = iter.next();
			if (partida.getEnCurso() == true)
				hayEnCurso = true;				
			
		}
		return hayEnCurso;
	} 
	
	
	public Boolean partidaEnCurso(String codPartida){
		Partida partida = find(codPartida);
		return partida.getEnCurso();
	} 
	
	public Boolean partidaInicializada(String codPartida){
		Partida partida = find(codPartida);
		return partida.getIniciada();
	} 	
	
	public void iniciarPartida(String codPartida, Mapa mapa){
		Partida partida = partidas.get(codPartida);
		partida.iniciarPartida(mapa);
	} 
	
	public void detenerPartida(String codPartida){
		Partida partida = find(codPartida);
		partida.setEnCurso(false);
	} 
	
	public void reanudarPartida(String codPartida){
		Partida partida = find(codPartida);
		partida.setEnCurso(true);
	} 
	
	public DataPartida_R4[] listarCodPartidas(){
		int cantPartidas = partidas.size(), i=0;
		DataPartida_R4[] data = new DataPartida_R4[cantPartidas];
		Iterator <Partida> iter = partidas.values().iterator();	

		while (iter.hasNext() && i<cantPartidas)//controlo ambos por las dudas
		{
			Partida partida = iter.next();
			data[i] = partida.cargaDataPartida_R4();
			i++;	
		}
		return data;
	} 
	                                    
    public DataJugador_R5[] listarNomJugadores(String codPartida){
    	Partida partida = find(codPartida);
		return partida.listarNomJugadores();    	
    } 
                                               
//	public void guardarPartidas(){
//
//	} 
    
	public Partida partidaEnCurso(){
		Iterator <Partida> iter = partidas.values().iterator();	
		boolean hayEnCurso = false;
		Partida partida = null;
		while (iter.hasNext() && !hayEnCurso)
		{
			partida = iter.next();
			if (partida.getEnCurso() == true)
				hayEnCurso = true;			
		}
		return partida;
	} 
	
	
    
	public void iniciarTurno(String codPartida){
		Partida partida = find(codPartida);
		partida.iniciarTurno();
	} 
    
	public DataJugador_R11[] viusalizarTablero(){
		Partida partida = partidaEnCurso();
		return partida.cargaDataJugadores();
	}
                                         
	public DataPartida_R16[] listarPartidasRegistradas(){
		int cantPartidas = partidas.size(), i=0;
		DataPartida_R16[] data = new DataPartida_R16[cantPartidas];
		Iterator <Partida> iter = partidas.values().iterator();	

		while (iter.hasNext() && i<cantPartidas)//controlo ambos por las dudas
		{
			Partida partida = iter.next();
			data[i] = partida.cargaDataPartida_R16();
			i++;	
		}
		return data;		
	}	
	
    public boolean esVacia(){
    	return partidas.isEmpty();
    }
    
    public int cantJugadores(String codPartida){
    	Partida partida = find(codPartida);
    	return partida.cantJugadores();
    }
    
	public DataPartida_R4 codigoPartidaEnCurso(){
		DataPartida_R4 data = new DataPartida_R4(partidaEnCurso().getCodigo());
		return data;
	} 
	
	
	public boolean hayPartidaNoInicializadas(){
		boolean hayInicializada=false;
		Iterator <Partida> iter = partidas.values().iterator();	
		while (iter.hasNext()){
			Partida partida = iter.next();
			if(!partida.getIniciada())
				hayInicializada=true;
		}
		
		return hayInicializada;	
	}	
	
	public boolean hayPartidaNoEnCurso(){
		boolean hayEnCurso=false;
		Iterator <Partida> iter = partidas.values().iterator();	
		while (iter.hasNext()){
			Partida partida = iter.next();
			if(!partida.getEnCurso()&&partida.getIniciada())
				hayEnCurso=true;
		}
		
		return hayEnCurso;	
	}
	
	public DataPartida_R4[] listarPartidasNoInicializadas(){
		int cantPartidas = partidas.size(), i=0;
		ArrayList<DataPartida_R4> listaData = new ArrayList<DataPartida_R4>();
		
		Iterator <Partida> iter = partidas.values().iterator();	
		while (iter.hasNext() && i<cantPartidas){
			Partida partida = iter.next();
			if(!partida.getIniciada())
				listaData.add(partida.cargaDataPartida_R4());
			i++;		
		}
		
		cantPartidas = listaData.size();
		DataPartida_R4[] data = new DataPartida_R4[cantPartidas];
		
		i=0;
		Iterator <DataPartida_R4> iteArray = listaData.iterator();
		while(iteArray.hasNext()) {
			DataPartida_R4 dataPartida_R4 = iteArray.next();
			data[i] = dataPartida_R4;
        	i++;
        } 
		return data;	
	}	
	
	public DataPartida_R16 listarPartida(String codigo) throws RemoteException{
		int cantPartidas = partidas.size(), i=0;
		DataPartida_R16 dataP = null;
		boolean encontre=false;
		Iterator <Partida> iter = partidas.values().iterator();	
		while (iter.hasNext() && !encontre){
			Partida partida = iter.next();
			if(partida.getCodigo().equals(codigo)){
				dataP = partida.cargaDataPartida_R16();
				encontre=true;
			}
		}
		return dataP;	
	}
	
	
	public DataPartida_R4[] listarPartidasNoEnCurso(){
		int cantPartidas = partidas.size(), i=0;
		ArrayList<DataPartida_R4> listaData = new ArrayList<DataPartida_R4>();
		
		Iterator <Partida> iter = partidas.values().iterator();	
		while (iter.hasNext() && i<cantPartidas){
			Partida partida = iter.next();
			if(!partida.getEnCurso()&&partida.getIniciada())
				listaData.add(partida.cargaDataPartida_R4());
			i++;		
		}
		
		cantPartidas = listaData.size();
		DataPartida_R4[] data = new DataPartida_R4[cantPartidas];
		
		i=0;
		Iterator <DataPartida_R4> iteArray = listaData.iterator();
		while(iteArray.hasNext()) {
			DataPartida_R4 dataPartida_R4 = iteArray.next();
			data[i] = dataPartida_R4;
        	i++;
        } 
		
		return data;		
	}	
	
	public void desloguearJugadores(String codPartida){
		Partida partida = find(codPartida);
		partida.desloguearJugadores();
	}

}
